#include "BlockQueue.hpp"
#include "Task.hpp"                                             
#include <pthread.h>
#include <unistd.h>

void* consumer(void* args) {
    BlockQueue<Task>* bq = static_cast<BlockQueue<Task>*>(args);
    while (1) {
        sleep(1);
        // 消费者消费任务
        Task t = bq->pop();
        // 处理任务
        t.Execute();
        cout << "这里消费了一个任务：" << t.getX() << "*" << t.getY() << "=" << t.getResult() << endl;
    }
}
void* productor(void* args) {
    int x = 2;
    int y = 3;
    BlockQueue<Task>* bq = static_cast<BlockQueue<Task>*>(args);
    while (1) {
        // 获得一个任务
        cout << "生产一个任务: " << x << "*" << y << "=?" << endl;
        Task t(x, y);
        bq->Equeue(t);
        x++;
        y++; 
    }
}

int main() {
    BlockQueue<Task>* bq = new BlockQueue<Task>();
    pthread_t c, p;
    pthread_create(&c, nullptr, consumer, bq);
    pthread_create(&p, nullptr, productor, bq);
    pthread_join(c, nullptr);
    pthread_join(p, nullptr);
    return 0;
}

// void* consumer(void* args) {
//     BlockQueue<task_t>* bq = static_cast<BlockQueue<task_t>*>(args);
//     while (1) {
//         sleep(10);
//         // 消费者消费任务
//         task_t t = bq->pop();
//         // 处理任务
//         t();
//     }
// }
// void* productor(void* args) {
//     BlockQueue<task_t>* bq = static_cast<BlockQueue<task_t>*>(args);
//     while (1) {
//         // 获得一个任务
//         cout << "生产了一个任务" << endl;
//         bq->Equeue(Download);
//     }
// }
// ******************************************************************

// int main() {
//     BlockQueue<task_t>* bq = new BlockQueue<task_t>();
//     pthread_t c[2], p[3];
//     pthread_create(c, nullptr, consumer, bq);
//     pthread_create(c + 1, nullptr, consumer, bq);
//     pthread_create(p, nullptr, productor, bq);
//     pthread_create(p + 1, nullptr, productor, bq);
//     pthread_create(p + 2, nullptr, productor, bq);

//     pthread_join(c[0], nullptr);
//     pthread_join(c[1], nullptr);
//     pthread_join(p[0], nullptr);
//     pthread_join(p[1], nullptr);
//     pthread_join(p[2], nullptr);
//     return 0;
// }